<?php
/**
 * 文件加载器
 *
 * @version $Id: Load.php 129 2013-09-23 03:43:30Z linsir123 $
 * @package Framework
 */
class Load
{
	/**
	 * 系统类列表，采用<<按需加载>>
	 *
	 * @var array
	 * @static
	 */
	static $LIST = array(
		'BASE' => array(
			// 基础流程类
			'App' => 'App.php',
			'Instance' => 'Instance.php',
			'Config' => 'Core/Config.php',
			'Debugger' => 'Core/Debugger.php',
			'Handler' => 'Core/Handler.php',
			'Hook' => 'Core/Hook.php',
			'Log' => 'Core/Log.php',
			'Controller' => 'Core/Mvc/Controller.php',
			'Dispatcher' => 'Core/Mvc/Dispatcher.php',
			'Request' => 'Core/Mvc/Request.php',
			'View' => 'Core/Mvc/View.php',

			// 服务提供类
			'LpRedis' => 'Store/LpRedis.php',
			'LpMysql' => 'Store/LpMysql.php',
			'ActiveRecord' => 'Store/ActiveRecord/ActiveRecord.php',
			'SqlBase' => 'Store/ActiveRecord/SqlBase.php',
			'ARCondition' => 'Store/ActiveRecord/Query/Condition.php',
			'ARCommand' => 'Store/ActiveRecord/Query/Command.php',
			'ARSelect' => 'Store/ActiveRecord/Query/Select.php'
		),
		'OTHER' => array()
	);

	/**
	 * APP过程加载的文件数
	 *
	 * @var array
	 * @static
	 */
	static $LOADED = array(__FILE__);

	/**
	 * 配置类自动加载
	 *
	 * @param string $class 类名
	 *
	 * @static
	 */
	static function autoLoad($class)
	{
		///
		if (isset(self::$LIST['BASE'][$class]))
			self::import(self::$LIST['BASE'][$class]);

		///
		elseif (isset(self::$LIST['OTHER'][$class]))
			self::import(self::$LIST['OTHER'][$class], null);
	}

	/**
	 * 注册类以便在使用时可以自动加载
	 *
	 * @param string $class 类名
	 * @param string $file 类对应的文件物理地址
	 *
	 * @static
	 */
	static function addClass($class, $file)
	{
		///
		self::$LIST['OTHER'][$class] = $file;
	}

	/**
	 * 注册类以便在使用时可以自动加载,对某个目录内的所有文件进行注册操作
	 *
	 * @param string $dir 类对应的文件目录物理地址
	 * @param array $excludes 不需要进行注册的文件的排除列表
	 * @param int $excludeType 排除方式(0不处理, 1进行加载)
	 *
	 * @static
	 */
	static function addClassByDir($dir, $excludes = array(), $excludeType = 0)
	{
		///
		if (! file_exists($dir)
			|| ! is_dir($dir)
		)
			return;

		///
		$files = glob($dir . "*.php");

		///
		foreach ($files as $file) {
			$class = basename($file, ".php");
			if (in_array($class, $excludes)) {
				switch ($excludeType) {
					///
					case 1:
						self::import($file, null);
						break;

					///
					default:
						break;
				}
			}
			else
				///
				self::addClass($class, $file);
		}
	}

	/**
	 * 加载文件
	 *
	 * @param string $file 文件名
	 * @param string $dir 文件所在的目录
	 * @param bool $throw 若文件不存在是否抛出异常
	 *
	 * @throws Exception
	 * @return mixed 若文件不存在返回`false`;否则返回`require`信息
	 * @static
	 */
	static function import($file, $dir = CORE_DIR, $throw = true)
	{
		///
		$file = $dir . $file;
		if (in_array($file, self::$LOADED))
			return false;

		///
		self::$LOADED[] = $file;

		///
		if (file_exists($file))
			return require($file);

		///
		if ($throw)
			throw new Exception("[APP] 文件不存在({$file})");

		///
		return false;
	}
}
